package mongodb

import (
	"encoding/json"
	"github.com/bitly/go-simplejson"
	"github.com/go-ini/ini" //ini配置库
	"gopkg.in/mgo.v2"
	"gopkg.in/mgo.v2/bson"
	"log"
	"time"
)

var (
	PUSHTOMONGO bool //指示是否推送到mongodb中
	IPANDPORT   string
	DBNAME      string
)

func init() {
	log.SetFlags(log.Lshortfile | log.LstdFlags)
	cfg, _ := ini.Load("./conf.ini")

	//从ini配置文件获取
	PUSHTOMONGO, _ = cfg.Section("service").Key("PushToMongo").Bool()
	IPANDPORT = cfg.Section("mongoset").Key("IPAndPort").String()
	DBNAME = cfg.Section("mongoset").Key("DbName").String()
}

//=======================================================================
//将参数结构体推送到mongodb中
//1.还会加入一个指示更新的时间UpdateTime
//=======================================================================
func PostParaStruct(j string) {
	//先判断是否配置为要推送到mongodb
	if !PUSHTOMONGO {
		log.Println("配置文件不容许推送到mongo中。")
		return
	}

	//json str 转map
	var dat map[string]interface{}
	err := json.Unmarshal([]byte(j), &dat)
	if err != nil {
		log.Fatal(err)
	}
	//log.Println(dat["Addr"])

	//session, err := mgo.Dial("127.0.0.1:27017") //连接新建会话，默认端口
	session, err := mgo.Dial(IPANDPORT) //连接新建会话，默认端口
	if err != nil {
		panic(err)
	}

	defer session.Close()

	//将json 字符串插入
	bj := []byte(j)
	var f interface{}
	err = json.Unmarshal(bj, &f)
	if err != nil {
		log.Fatal(err)
		return
	}

	// Collection People，新建数据库并新建一个people的集合
	c := session.DB(DBNAME).C("paraStruct")
	// Upsert Datas
	//err = c.Insert(f)
	//err = c.Update(bson.M{"Addr": dat["Addr"]}, f)
	_, err = c.Upsert(bson.M{"Addr": dat["Addr"]}, f) //upsert 如果存在就更新，如果不存在就创建
	//将更新时间也插进去
	c.Update(bson.M{"Addr": dat["Addr"]}, bson.M{"$set": bson.M{"UpdateTime": time.Now().Format("2006-01-02 15:04:05")}})

	if err != nil {
		panic(err)
	}
	log.Println("将参数结构体推送到mongodb中。")
}

//=======================================================================
//将日记录添加到mongodb中
//1.还会加入一个指示更新的时间UpdateTime
//=======================================================================
func PostDayRecord(j string) {

	//先判断是否配置为要推送到mongodb
	if !PUSHTOMONGO {
		log.Println("配置文件不容许推送到mongo中。")
		return
	}

	//session, err := mgo.Dial("127.0.0.1:27017") //连接新建会话，默认端口
	session, err := mgo.Dial(IPANDPORT) //连接新建会话，默认端口
	if err != nil {
		panic(err)
	}

	defer session.Close()

	// Collection People，新建数据库并新建一个people的集合
	c := session.DB(DBNAME).C("dayRecord")

	js, _ := simplejson.NewJson([]byte(j))
	list, _ := js.Get("List").Array()
	//返回的是一个记录数组
	for _, v := range list {
		//对每一条记录进行插入
		//addr, _ := js.Get("List").GetIndex(k).Get("Addr").String()
		_, err = c.Upsert(v, v) //upsert 如果存在就更新，如果不存在就创建
		if err != nil {
			log.Fatal(err)
		}
		//将更新时间也插进去
		c.Update(v, bson.M{"$set": bson.M{"UpdateTime": time.Now().Format("2006-01-02 15:04:05")}})
	}

	log.Println("将日记录推送到mongodb中。")
}

//==============================================================
//将详细记录添加到mongodb中
////1.还会加入一个指示更新的时间UpdateTime
//=======================================================================
func PostDetailRecord(j string) {

	//先判断是否配置为要推送到mongodb
	if !PUSHTOMONGO {
		log.Println("配置文件不容许推送到mongo中。")
		return
	}

	//session, err := mgo.Dial("127.0.0.1:27017") //连接新建会话，默认端口
	session, err := mgo.Dial(IPANDPORT) //连接新建会话，默认端口
	if err != nil {
		log.Fatal(err)
		//panic(err)
	}

	defer session.Close()

	// Collection People，新建数据库并新建一个people的集合
	c := session.DB(DBNAME).C("DetailRecord")

	js, _ := simplejson.NewJson([]byte(j))
	list, _ := js.Get("List").Array()
	for _, v := range list {
		//对每一条记录进行插入
		//addr, _ := js.Get("List").GetIndex(k).Get("Addr").String()
		_, err = c.Upsert(v, v) //upsert 如果存在就更新，如果不存在就创建
		if err != nil {
			log.Fatal(err)
		}
		//将更新时间也插入到记录上
		c.Update(v, bson.M{"$set": bson.M{"UpdateTime": time.Now().Format("2006-01-02 15:04:05")}})
		//_, err = c.Update(v, bson.M{"$set": bson.M{"UpdateTime": "2016-03-09"}}) //upsert 如果存在就更新，如果不存在就创建

	}

	log.Println("将详细记录推送到mongodb中。")
}
